package cn.com.system.controller;

import cn.com.common.config.FileUploadProperties;
import cn.com.common.result.DataResult;
import cn.com.system.mapper.SysRoleMapper;
import cn.com.system.service.DeptService;
import cn.com.system.service.HomeService;
import cn.com.system.service.PermissionService;
import cn.com.system.service.impl.HttpSessionService;


import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 首页
 *
 * @author wenbin
 * @version V1.0
 * @date 2020年3月18日
 */
@RestController
@RequestMapping("/sys")
@Api(tags = "首页数据")
public class HomeController {
	@Resource
	private HomeService homeService;
	@Resource
	private HttpSessionService httpSessionService;
	@Resource
	private DeptService deptService;

	@Resource
	private SysRoleMapper sysRoleMapper;

	@Resource
	private FileUploadProperties fileUploadProperties;
	
	/*@Resource
	private WorkriskControlService workriskControlService;
	
	@Autowired
	private WorkriskRisk1Service workriskRisk1Service;*/

	@Autowired
	private PermissionService permissionService;
	
	@GetMapping("/home")
	@ApiOperation(value = "获取首页数据接口")
	public DataResult getHomeInfo() {
		// 通过access_token拿userId
		// String userId = httpSessionService.getCurrentUserId();
		String userId = httpSessionService.getCurrentIdentityNo();
		DataResult result = DataResult.success();
		result.setData(homeService.getHomeInfo(userId));
		return result;
	}

	@GetMapping("/menuSearch")
	@ApiOperation(value = "首页菜单搜索")
	public DataResult menuSearch(String menuName) {
		String currentIdentityNo = httpSessionService.getCurrentIdentityNo();
		// DataResult result = DataResult.success();
		return DataResult.success(permissionService.searchPermissionTreeList(currentIdentityNo,menuName));
	}

	/*@PostMapping("/getXxtx")
	@ApiOperation(value = "获取首页数据接口")
	public DataResult getXxtx() {
		
		String currentUserId = httpSessionService.getCurrentUserId();
		String currentRolesId = httpSessionService.getCurrentRolesId();
		String currentDeptId = httpSessionService.getCurrentDeptId();
		
		boolean status1 = currentRolesId.contains("1717361227428265985");
        boolean status2 = currentRolesId.contains("1708113663597502466");
        // 督办数量
		LambdaQueryWrapper<WorkriskControlEntity> queryWrapper1 = Wrappers.lambdaQuery();
		// 查询条件示例
		
		if(status1){
			// 日志-纪检岗
			queryWrapper1.like(WorkriskControlEntity::getControlMan1, "1717361227428265985");
			queryWrapper1.eq(WorkriskControlEntity::getTaxorgcode, currentDeptId);
			
		}else if(status2){
			// 检查-检查科科长岗位
			queryWrapper1.like(WorkriskControlEntity::getControlMan1, "1708113663597502466");
			queryWrapper1.eq(WorkriskControlEntity::getTaxorgcode, currentDeptId);
			// queryWrapper.isNull(WorkriskControlEntity::getControlRead1);
			
		}else{
			// 检查人
			queryWrapper1.like(WorkriskControlEntity::getControlMan1, currentUserId);
			queryWrapper1.eq(WorkriskControlEntity::getTaxorgcode, currentDeptId);
			
		}
		
		queryWrapper1.ne(WorkriskControlEntity::getStateCode, "3");
		
		int count1 = workriskControlService.count(queryWrapper1);

		
		
		
		// 提醒数量
		LambdaQueryWrapper<WorkriskRisk1Entity> queryWrapper = Wrappers.lambdaQuery();
		queryWrapper.like(WorkriskRisk1Entity::getRiskMan1, currentUserId);
		queryWrapper.isNull(WorkriskRisk1Entity::getRiskRead1);
		queryWrapper.eq(WorkriskRisk1Entity::getTaxorgcode, currentDeptId);
		
		int count2 = workriskRisk1Service.count(queryWrapper);
		
		List<String> list = new ArrayList<>();
		list.add(String.valueOf(count1));
		list.add(String.valueOf(count2));
		
		return DataResult.success(list);
	}*/

	@PostMapping("/getYqsqSl")
	@ApiOperation(value = "获取首页获取延期申请数量")
	public DataResult getYqsqSl() {
		return null;
	}

	/**
	 * 获取MP3提醒声音
	 * 
	 * @param response
	 * @param request
	 */
	@GetMapping("/getMp3Sy")
	@ApiOperation(value = "获取提醒声音")
	public void getMp3Sy(HttpServletResponse response, HttpServletRequest request) {

		String database = fileUploadProperties.getPath() + "/template/" + "reminderSound.mp3";

		// 文件目录（偷懒没有改变量，名称，此处和FTP没关系，就是文件的绝对路径）
		// 也就是 File music = new
		// File("C:\Users\Administrator\AppData\Local\Temp\a.mp3");
		File music = new File(database);
		String range = request.getHeader("Range");
		// 开始下载位置
		long startByte = 0;
		// 结束下载位置
		long endByte = music.length() - 1;
		// 有range的话
		if (range != null && range.contains("bytes=") && range.contains("-")) {
			range = range.substring(range.lastIndexOf("=") + 1).trim();
			String ranges[] = range.split("-");
			try {
				// 判断range的类型
				if (ranges.length == 1) {
					// 类型一：bytes=-2343
					if (range.startsWith("-")) {
						endByte = Long.parseLong(ranges[0]);
					}
					// 类型二：bytes=2343-
					else if (range.endsWith("-")) {
						startByte = Long.parseLong(ranges[0]);
					}
				}
				// 类型三：bytes=22-2343
				else if (ranges.length == 2) {
					startByte = Long.parseLong(ranges[0]);
					endByte = Long.parseLong(ranges[1]);
				}
			} catch (NumberFormatException e) {
				startByte = 0;
				endByte = music.length() - 1;
			}
		}
		// 要下载的长度
		long contentLength = endByte - startByte + 1;
		// 文件名
		String fileName = music.getName();
		// 文件类型
		String contentType = request.getServletContext().getMimeType(fileName);
		// 各种响应头设置
		// 参考资料：https://www.ibm.com/developerworks/cn/java/joy-down/index.html
		// 坑爹地方一：看代码
		response.setHeader("Accept-Ranges", "bytes");
		// 坑爹地方二：http状态码要为206
		response.setStatus(206);
		response.setContentType(contentType);
		response.setHeader("Content-Type", contentType);
		// 这里文件名换你想要的，inline表示浏览器直接实用（我方便测试用的）
		// 参考资料：http://hw1287789687.iteye.com/blog/2188500
		// response.setHeader("Content-Disposition",
		// "inline;filename=test.mp3");
		response.setHeader("Content-Length", String.valueOf(contentLength));
		// 坑爹地方三：Content-Range，格式为
		// [要下载的开始位置]-[结束位置]/[文件总大小]
		response.setHeader("Content-Range", "bytes " + startByte + "-" + endByte + "/" + music.length());
		BufferedOutputStream outputStream = null;
		RandomAccessFile randomAccessFile = null;
		// 已传送数据大小
		long transmitted = 0;
		try {
			randomAccessFile = new RandomAccessFile(music, "r");
			outputStream = new BufferedOutputStream(response.getOutputStream());
			byte[] buff = new byte[4096];
			int len = 0;
			randomAccessFile.seek(startByte);
			// 坑爹地方四：判断是否到了最后不足4096（buff的length）个byte这个逻辑（(transmitted + len) <=
			// contentLength）要放前面！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
			// 不然会会先读取randomAccessFile，造成后面读取位置出错，找了一天才发现问题所在
			while ((transmitted + len) <= contentLength && (len = randomAccessFile.read(buff)) != -1) {
				outputStream.write(buff, 0, len);
				transmitted += len;
				// 停一下，方便测试，用的时候删了就行了
				Thread.sleep(10);
			}
			// 处理不足buff.length部分
			if (transmitted < contentLength) {
				len = randomAccessFile.read(buff, 0, (int) (contentLength - transmitted));
				outputStream.write(buff, 0, len);
				transmitted += len;
			}
			outputStream.flush();
			response.flushBuffer();
			randomAccessFile.close();
			// System.out.println("下载完毕：" + startByte + "-" + endByte + "：" +
			// transmitted);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			try {
				if (randomAccessFile != null) {
					randomAccessFile.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	@PostMapping("/getJinBaZhouQingkuangshuju")
	@ApiOperation(value = "获取首页数据接口")
	public DataResult getJinBaZhouQingkuangshuju() {
		return null;
	}

}
